package 基础语法;

import java.util.TreeMap;
import java.util.TreeSet;

public class compareTo {
    public static void main(String[] args) {
        TreeSet<MyClass> treeSet = new TreeSet<>();// 底层用的是红黑树
        treeSet.add(new MyClass(4));
        treeSet.add(new MyClass(2));
        treeSet.add(new MyClass(8));
        treeSet.add(new MyClass(1));

        System.out.println(treeSet);// 按compareTo的规则排序
        TreeSet<Integer> treeSet1 = new TreeSet<>();// 底层用的是红黑树
        treeSet1.add(new Integer(1));
        treeSet1.add(new Integer(1));
        System.out.println(treeSet1);// 也会去重

        // 源码中 他还有一个构造器：TreeSet(Comparator<? super E> comparator)，使用这个构造器可以不让自定义的类实现那个接口
        // 有@FunctionalInterface,这个接口Comparator可以用Lambda表达式
        // Comparator源码需要实现的方法：int compare(T o1, T o2);
        TreeSet<MyClass_1> treeSet2 = new TreeSet<>((o1, o2) -> {// 若MyClass_1也实现了接口，按此处的为准
            return o1.o - o2.o;// 不用强转
            // TreeSet(Comparator<? super E> comparator)中的E就是MyClass_1，也是compare中的T
            // return ((MyClass_1) o1).o - ((MyClass_1) o2).o;
        });
        treeSet2.add(new MyClass_1(1));
        treeSet2.add(new MyClass_1(6));
        treeSet2.add(new MyClass_1(4));
        treeSet2.add(new MyClass_1(0));
        treeSet2.add(new MyClass_1(0));// 那个方法的返回值一样，就会去掉

        System.out.println(treeSet2);

        TreeMap<MyClass, Integer> treeMap = new TreeMap<>();// 和TreeSet类似，构造器还能接受那个接口。按键排序
        treeMap.put(new MyClass(0), 1);
        treeMap.put(new MyClass(2), 13);
        treeMap.put(new MyClass(4), 12);
        treeMap.put(new MyClass(1), 19);
        System.out.println(treeMap);

    }

}

class MyClass implements Comparable<MyClass> {// 指定泛型为 MyClass，本例没必要用泛型
    int o;

    MyClass(int o) {
        this.o = o;

    }

    @Override
    public int compareTo(MyClass myClass) {
        return this.o - myClass.o;

    }

    @Override
    public String toString() {
        return this.o + "";
    }
}

class MyClass_1 {// 指定泛型为 MyClass，本例没必要用泛型
    int o;

    MyClass_1(int o) {
        this.o = o;

    }

    @Override
    public String toString() {
        return this.o + "";
    }
}